package com.divemotor.ventarepuestosinternet.dao.impl;

import java.io.Serializable;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.divemotor.ventarepuestosinternet.dao.AdministradorDAO;
import com.divemotor.ventarepuestosinternet.model.Administrador;
import com.divemotor.ventarepuestosinternet.model.Usuario;
import com.divemotor.ventarepuestosinternet.util.Constantes;
import com.divemotor.ventarepuestosinternet.util.DatosDeSession;

@SuppressWarnings("unchecked")
@Repository(value = "administradorDAO")
public class AdministradorDAOImpl extends  GenericoDAOImpl<Administrador, Integer> implements AdministradorDAO, Serializable{

	private static final long serialVersionUID = 364185148396974618L;
	
	@Autowired
	private SessionFactory sessionFactory;
	
	public AdministradorDAOImpl() {
		setClase(Administrador.class);
	}

	@Override
	public List<Administrador> buscarAdministradores(Administrador administrador){
		Criteria criteria=sessionFactory.getCurrentSession().createCriteria(Administrador.class, "adm");
		criteria.createAlias("adm.usuario", "usu");
		criteria.add(Restrictions.eq("usu.pais", DatosDeSession.obtenerPaisDelUsuarioAutenticado()));
		if (!administrador.getUsuario().getNombres().equals("")) {
			criteria.add(Restrictions.like("usu.nombres", "%" + administrador.getUsuario().getNombres() + "%").ignoreCase());
		}
		
		if (!administrador.getUsuario().getApellidos().equals("")) {
			criteria.add(Restrictions.like("usu.apellidos", "%" + administrador.getUsuario().getApellidos() + "%").ignoreCase());
		}
		if (!administrador.getUsuario().getUsuario().equals("")) {
			criteria.add(Restrictions.like("usu.usuario", "%" + administrador.getUsuario().getUsuario() + "%").ignoreCase());
		}
		
		if (!administrador.getEstado().equals(Constantes.NO_SELECCIONADO_ETIQUETA)) {
			criteria.add(Restrictions.eq("adm.estado", administrador.getEstado()));
		}
		criteria.add(Restrictions.not(Restrictions.eq("adm.estado", "E")));
        return criteria.list();
	}

	@Override
	public void eliminarConEstado(Administrador administrador) {
		sessionFactory.getCurrentSession().merge(administrador);
	}

	@Override
	public void eliminarPorUsuario(Administrador administrador) {
		sessionFactory.getCurrentSession().merge(administrador);
	}

	@Override
	public Administrador obtenerPorIdUsuario(Usuario usuario) {
		Criteria criteria =  sessionFactory.getCurrentSession().createCriteria(Administrador.class);
		criteria.add(Restrictions.eq("usuario", usuario));
		criteria.add(Restrictions.not(Restrictions.eq("estado", Constantes.ESTADO_ELIMINADO)));
		return (Administrador) criteria.uniqueResult();
	}

	@Override
	public void insertarSinRetorna(Administrador administrador) {
	   sessionFactory.getCurrentSession().persist(administrador);
	   sessionFactory.getCurrentSession().flush();
	}
}
